﻿#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
//初始化通讯录，不然通讯里全是随机值
void InitContact(Contact* ps)
{
	assert(ps);
	ps->sz = 0;
	memset(ps->data, 0, sizeof(ps->data));//数组名单独放在里面是整个数组的大小
}
//第一查看：是否需要const
//第二:记住要指针需要断言
//第三：根据情况判断通讯录为空或者为满，必须判断
//第四：sz和结构体数组是对应的，随时注意sz的增减

//展示通讯录
void ShowContact(const Contact* ps)
{
	assert(ps);//
	if (ps->sz == 0)
	{
		printf("通讯录为空，无需打印\n");
		return 0;
	}
	int i = 0;
	//标题显得更加清晰
	printf("%-20s%-5s%-5s%-12s%-30s\n", "姓名","年龄","性别","电话","住址");
	//多组数据，用for循环
	for (i = 0; i < ps->sz; i++)
	{
		printf("%-20s%-5d%-5s%-12s%-30s\n", //
			ps->data[i].name, ps->data[i].age, ps->data[i].sex, ps->data[i].tele, ps->data[i].address);
	}
}

//增加通讯录
void AddContact(Contact* ps)
{
	assert(ps);
	printf("请输入姓名：>\n");
	scanf("%s", ps->data[ps->sz].name);//name是数组名不用&
	printf("请输入年龄：>\n");
	scanf("%d", &(ps->data[ps->sz].age));
	printf("请输入性别：>\n");
	scanf("%s", ps->data[ps->sz].sex);
	printf("请输入电话：>\n");
	scanf("%s", ps->data[ps->sz].tele);
	printf("请输入住址：>\n");
	scanf("%s", ps->data[ps->sz].address);
	//增加完一个人的信息
	ps->sz++;
	printf("增加成功！！\n");
}


//查找函数内部秘密函数
int FindContact(const Contact* ps,char*NAME)
{
	assert(ps);
	int j = 0;
	for (j = 0; j < ps->sz; j++)
	{
		if (strcmp(ps->data[j].name,NAME) == 0)//字符串只能用strcmp比较
		{
			return j;
		}
	}
	return -1;
}

//删除一个人的信息
void DelContact(Contact* ps)
{
	char NAME[NAME_MAX];
	assert(ps);
	if (ps->sz == 0)
	{
		printf("通讯录为空，无内容可删请增加谢谢！\n");
	}
	printf("请输入你要删除人的姓名：>\n");
	scanf("%s", NAME);//数组名
	int ret=FindContact(ps,NAME);//查找函数
	if (ret == -1)
	{
		printf("没有找到此人\n");
		return;
	}
	else
	{
		printf("找到此人，可以删除\n");
		int i = 0;
		for (i = ret; i < ps->sz - 1; i++)
		{
			ps->data[i] = ps->data[i + 1];
		}
	}
	ps->sz--;//如果要删除最后一个，最后一个在这里被删除了。
	printf("删除成功!!\n");
}


//修改一个人的信息
void MODIFYContact(Contact* ps)
{
	char NAME[NAME_MAX];
	assert(ps);
	if (ps->sz == 0)
	{
		printf("通讯录为空，无内容可删请增加谢谢！\n");
	}
	printf("请输入你要修改人的姓名：>\n");
	scanf("%s", NAME);//数组名
	int ret = FindContact(ps, NAME);//查找函数
	if (ret == -1)
	{
		printf("没有找到此人\n");
		return;
	}
	else
	{
		printf("请重新输入姓名：>\n");
		scanf("%s", ps->data[ret].name);//name是数组名不用&
		printf("请重新输入年龄：>\n");
		scanf("%d", &(ps->data[ret].age));
		printf("请重新输入性别：>\n");
		scanf("%s", ps->data[ret].sex);
		printf("请重新输入电话：>\n");
		scanf("%s", ps->data[ret].tele);
		printf("请重新输入住址：>\n");
		scanf("%s", ps->data[ret].address);
		//优化：后期想指定某一个修改呢？
	}
	printf("修改成功！！\n");
}


//查找
void SEARCHContact(const Contact* ps)
{
	char NAME[NAME_MAX];
	assert(ps);
	if (ps->sz == 0)
	{
		printf("通讯录为空，无内容可删请增加谢谢！\n");
	}
	printf("请输入你要查找人的姓名：>\n");
	scanf("%s", NAME);//数组名
	int ret = FindContact(ps, NAME);//查找函数
	if (ret == -1)
	{
		printf("没有找到此人\n");
		return;
	}
	else//找到
	{
		//标题显得更加清晰
		printf("%-20s%-5s%-5s%-12s%-30s\n", "姓名", "年龄", "性别", "电话", "住址");
		printf("%-20s%-5d%-5s%-12s%-30s\n", //
				ps->data[ret].name, ps->data[ret].age, ps->data[ret].sex, ps->data[ret].tele, ps->data[ret].address);
	}
}

//void qsort(void* base, size_t num, size_t size,
//	int (*compar)(const void*, const void*));
//按照名字来
int compare_name(const void* p1, const void* p2)
{
	return strcmp((char*)p1, (char*)p2);//❌
}
void test1(const Contact *ps)
{
	assert(ps);
	qsort(ps, ps->sz, sizeof(ps->data[0]), compare_name);
	int i = 0;
	for (i = 0; i < ps->sz; i++)
	{
		printf("%s ", ps->data[i].name);
	}
}


//按照年龄来
int compare_age(const void* p1, const void* p2)
{
	return *(char*)p1-*(char*)p2;
}
void test2(const Contact* ps)
{
	assert(ps);
	qsort(ps, ps->sz, sizeof(ps->data[0]), compare_age);
	int i = 0;
	for (i = 0; i < ps->sz; i++)
	{
		printf("%d ", ps->data[i].age);
	}
}


void sort()
{
	printf("*****      1.name       ****\n");
	printf("*****      2.age        ****\n");
}

void SORTContact(const Contact* ps)
{
	assert(ps);
	if (ps->sz <= 2)
	{
		printf("通讯录不足两人，请添加后再排序\n");
		return;
	}
	//实现两种
	//按照名字大小排序
	//按照年龄大小排序
	int choose = 0;
	do
	{
		sort();
		printf("请输入你想要选择的排序方式：");
		scanf("%d", &choose);
		switch(choose)
		{
		case 1:
			test1(ps);
			printf("\n");
			break;
		case 2:
			test2(ps);
			printf("\n");
			break;
		case 0:
			printf("退出通讯录排序功能\n");
			break;
		default:
			printf("选择错误，请重新选择\n");
			break;
		}
	} while (choose);
}



////修改一个人的信息
//void MODIFYContact(Contact* ps)
//{
//	char NAME[NAME_MAX];
//	assert(ps);
//	if (ps->sz == 0)
//	{
//		printf("通讯录为空，无内容可删请增加谢谢！\n");
//	}
//	//
//	printf("请输入你要修改人的姓名：>\n");
//	scanf("%s", NAME);//数组名
//	int ret = FindContact(ps, NAME);//查找函数
//	if (ret == -1)
//	{
//		printf("没有找到此人\n");
//		return;
//	}
//	else
//	{
//		int i = 0;
//		for (i = ret; i < ps->sz - 1; i++)
//		{
//			ps->data[i] = ps->data[i + 1];
//		}
//		ps->sz--;
//
//		//再次输入
//		printf("请重新输入姓名：>\n");
//		scanf("%s", ps->data[ps->sz].name);//name是数组名不用&
//		printf("请重新输入年龄：>\n");
//		scanf("%d", &(ps->data[ps->sz].age));
//		printf("请重新输入性别：>\n");
//		scanf("%s", ps->data[ps->sz].sex);
//		printf("请重新输入电话：>\n");
//		scanf("%s", ps->data[ps->sz].tele);
//		printf("请重新输入住址：>\n");
//		scanf("%s", ps->data[ps->sz].address);
//		ps->sz++;
//		//优化：后期想指定某一个修改呢？
//	}
//	printf("修改成功！！\n");
//}

